package cn.kgc.config;

import cn.kgc.entity.Loginfo;
import cn.kgc.service.LoginfoService;
import cn.kgc.util.BaseLog;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.lang.reflect.Method;

/**
 * 如果方法上使用了BaseLog注解,在方法执行时就会记录操作日志信息(增强的功能)。
 * 切面= 切点(增强要添加的位置) + 增强(增强的功能)
 * @author wangyue
 * @version 1.0
 */
@Slf4j
@Aspect
@Component
@SuppressWarnings("all")
public class BaseLogAdvice {

    @Pointcut("@annotation(cn.kgc.util.BaseLog)")
    public void logPointCut(){}

    @Resource
    private LoginfoService loginfoService;

    @Around(value = "logPointCut()")
    public Object aroundAutoLog(ProceedingJoinPoint joinPoint){
        long time1=System.currentTimeMillis();   //目标方法执行之前 记录下从1970年1月1日到下面一行代码运行时所经过的毫秒数
        Object result = null;
        try {
            result = joinPoint.proceed(); //执行目标方法（使用了BaseLog注解的方法）
        }catch (Throwable e) {
            throw new RuntimeException(e);
        }finally{
            long time2=System.currentTimeMillis(); //目标方法之后记录下从1970年1月1日到下面一行代码运行时所经过的毫秒数
            int costTime=(int)(time2-time1);
            Loginfo loginfo=new Loginfo();
            long userId=1;   //TODO 获得用户ID
            Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
            BaseLog methodAnnotation = method.getAnnotation(BaseLog.class);
            loginfo.setLogType(methodAnnotation.logType().getType());
            loginfo.setModuleName(methodAnnotation.moduleName().getType());
            loginfo.setLogContent(methodAnnotation.logContent());
            loginfo.setMethodName(method.getName());
            loginfo.setOperateType(methodAnnotation.operateType().getType());
            loginfo.setUserId(userId);
            loginfo.setCostTime(costTime);
            loginfoService.save(loginfo);   //将日志信息保存到数据库中
            return result;
        }
    }
}